//
// Created by 32827 on 2024/7/3.
//
#include "yzf_adc.h"

YZF_RESULT yzf_adc_clock_open(YZF_ADC_POINTER adc){
    switch ((uint32_t)adc) {
        case (uint32_t) ADC1:
            RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;
            break;
        case (uint32_t) ADC2:
            RCC->APB2ENR |= RCC_APB2ENR_ADC2EN;
            break;
        case (uint32_t) ADC3:
            RCC->APB2ENR |= RCC_APB2ENR_ADC3EN;
            break;
        default:
            return YZF_NOT_FOUND;
    }
    return YZF_OK;
}
YZF_RESULT yzf_adc_cr_reset(YZF_ADC_POINTER adc){
    adc->CR1 = 0;
    adc->CR2 = 0;
    return YZF_OK;
}
YZF_RESULT yzf_adc_dma_enable(YZF_ADC_POINTER adc,YZF_BOOL isEnable){
    YZF_MODIFY_REG(adc->CR2,ADC_CR2_DMA,isEnable,ADC_CR2_DMA_Pos);
    return YZF_OK;
}
YZF_RESULT yzf_adc_dma_disable_selection(YZF_ADC_POINTER adc,YZF_BOOL isEnable){
    YZF_MODIFY_REG(adc->CR2,ADC_CR2_DDS,isEnable,ADC_CR2_DDS_Pos);
    return YZF_OK;
}
YZF_BOOL yzf_adc_flag_OVR(YZF_ADC_POINTER adc,YZF_BOOL isClear){
    return YZF_FLAG_BIT_C(adc->SR,ADC_SR_OVR,isClear);
}
YZF_BOOL yzf_adc_flag_EOC(YZF_ADC_POINTER adc,YZF_BOOL isClear){
    return YZF_FLAG_BIT_C(adc->SR,ADC_SR_EOC,isClear);
}
YZF_BOOL yzf_adc_flag_JEOC(YZF_ADC_POINTER adc,YZF_BOOL isClear){
    return YZF_FLAG_BIT_C(adc->SR,ADC_SR_JEOC,isClear);
}
YZF_BOOL yzf_adc_flag_AWD(YZF_ADC_POINTER adc,YZF_BOOL isClear){
    return YZF_FLAG_BIT_C(adc->SR,ADC_SR_AWD,isClear);
}
YZF_BOOL yzf_adc_flag_JSTRT(YZF_ADC_POINTER adc,YZF_BOOL isClear){
    return YZF_FLAG_BIT_C(adc->SR,ADC_SR_JSTRT,isClear);
}
YZF_BOOL yzf_adc_flag_STRT(YZF_ADC_POINTER adc,YZF_BOOL isClear){
    return YZF_FLAG_BIT_C(adc->SR,ADC_SR_STRT,isClear);
}
YZF_RESULT yzf_adc_interrupt_OVR_enable(YZF_ADC_POINTER adc){
    YZF_ENABLE(adc->CR1,ADC_CR1_OVRIE);
    return YZF_OK;
}
YZF_RESULT yzf_adc_interrupt_OVR_disable(YZF_ADC_POINTER adc){
    YZF_DISABLE(adc->CR1,ADC_CR1_OVRIE);
    return YZF_OK;
}
YZF_RESULT yzf_adc_resolution_set(YZF_ADC_POINTER adc,YZF_ADC_RESOLUTION resolution){
    YZF_MODIFY_REG(adc->CR1,ADC_CR1_RES,resolution,ADC_CR1_RES_Pos);
    return YZF_OK;
}
YZF_RESULT yzf_adc_AWD_enable(YZF_ADC_POINTER adc){
    YZF_ENABLE(adc->CR1,ADC_CR1_AWDEN);
    return YZF_OK;
}
YZF_RESULT yzf_adc_AWD_disable(YZF_ADC_POINTER adc){
    YZF_DISABLE(adc->CR1,ADC_CR1_AWDEN);
    return YZF_OK;
}
YZF_RESULT yzf_adc_JAWD_enable(YZF_ADC_POINTER adc){
    YZF_ENABLE(adc->CR1,ADC_CR1_JAWDEN);
    return YZF_OK;
}
YZF_RESULT yzf_adc_JAWD_disable(YZF_ADC_POINTER adc){
    YZF_DISABLE(adc->CR1,ADC_CR1_JAWDEN);
    return YZF_OK;
}
YZF_RESULT  yzf_adc_JAUTO_enable(YZF_ADC_POINTER adc){
    YZF_ENABLE(adc->CR1,ADC_CR1_JAUTO);
    return YZF_OK;
}
YZF_RESULT  yzf_adc_JAUTO_disable(YZF_ADC_POINTER adc){
    YZF_DISABLE(adc->CR1,ADC_CR1_JAUTO);
    return YZF_OK;
}
YZF_RESULT yzf_adc_interrupt_JEOC_enable(YZF_ADC_POINTER adc){
    YZF_ENABLE(adc->CR1,ADC_CR1_JEOCIE);
    return YZF_OK;
}
YZF_RESULT yzf_adc_interrupt_JEOC_disable(YZF_ADC_POINTER adc){
    YZF_DISABLE(adc->CR1,ADC_CR1_JEOCIE);
    return YZF_OK;
}
YZF_RESULT yzf_adc_interrupt_AWD_enable(YZF_ADC_POINTER adc){
    YZF_ENABLE(adc->CR1,ADC_CR1_AWDIE);
    return YZF_OK;
}
YZF_RESULT yzf_adc_interrupt_AWD_disable(YZF_ADC_POINTER adc){
    YZF_DISABLE(adc->CR1,ADC_CR1_AWDIE);
    return YZF_OK;
}
YZF_RESULT yzf_adc_interrupt_EOC_enable(YZF_ADC_POINTER adc){
    YZF_ENABLE(adc->CR1,ADC_CR1_EOCIE);
    return YZF_OK;
}
YZF_RESULT yzf_adc_interrupt_EOC_disable(YZF_ADC_POINTER adc){
    YZF_DISABLE(adc->CR1,ADC_CR1_EOCIE);
    return YZF_OK;
}
YZF_RESULT yzf_adc_watchdog_channel_set(YZF_ADC_POINTER adc,uint8_t channel_select){
    YZF_MODIFY_REG(adc->CR1,ADC_CR1_AWDCH,channel_select,ADC_CR1_AWDCH_Pos);
    return YZF_OK;
}
YZF_RESULT yzf_adc_SWSTART(YZF_ADC_POINTER adc){
    YZF_ENABLE(adc->CR2,ADC_CR2_SWSTART);
     return YZF_OK;
}
YZF_RESULT yzf_adc_EXTEN(YZF_ADC_POINTER adc,uint8_t ext){
    YZF_MODIFY_REG(adc->CR2,ADC_CR2_EXTEN,ext,ADC_CR2_EXTEN_Pos);
    return YZF_OK;
}
YZF_RESULT yzf_adc_EXTSEL(YZF_ADC_POINTER adc,uint8_t extsel){
    YZF_MODIFY_REG(adc->CR2,ADC_CR2_EXTSEL,extsel,ADC_CR2_EXTSEL_Pos);
    return YZF_OK;
}
YZF_RESULT yzf_adc_JSWSTART(YZF_ADC_POINTER adc){
    YZF_ENABLE(adc->CR2,ADC_CR2_JSWSTART);
    return YZF_OK;
}
YZF_RESULT yzf_adc_JEXTSEL(YZF_ADC_POINTER adc,uint8_t extsel){
    YZF_MODIFY_REG(adc->CR2,ADC_CR2_JEXTSEL,extsel,ADC_CR2_JEXTSEL_Pos);
    return YZF_OK;
}
YZF_RESULT  yzf_adc_ALIGN(YZF_ADC_POINTER adc,YZF_BOOL isLeft){
    YZF_MODIFY_REG(adc->CR2,ADC_CR2_ALIGN,isLeft,ADC_CR2_ALIGN_Pos);
    return YZF_OK;
}
YZF_RESULT  yzf_adc_EOCS(YZF_ADC_POINTER adc,YZF_BOOL isEOCS){
    YZF_MODIFY_REG(adc->CR2,ADC_CR2_EOCS,isEOCS,ADC_CR2_EOCS_Pos);
    return YZF_OK;
}
YZF_RESULT  yzf_adc_CONT(YZF_ADC_POINTER adc,YZF_BOOL isContinue){
    YZF_MODIFY_REG(adc->CR2,ADC_CR2_CONT,isContinue,ADC_CR2_CONT_Pos);
    return YZF_OK;
}
YZF_RESULT  yzf_adc(YZF_ADC_POINTER adc,YZF_BOOL isOn){
    YZF_MODIFY_REG(adc->CR2,ADC_CR2_ADON,isOn,ADC_CR2_ADON_Pos);
    return YZF_OK;
}
YZF_RESULT yzf_adc_SMPR(YZF_ADC_POINTER adc,uint8_t ch,uint8_t smpr){
    if(ch<10){
        YZF_MODIFY_REG(adc->SMPR2,0x7UL<<(ch*3),smpr,ch*3);
    }else{
        YZF_MODIFY_REG(adc->SMPR1,0x7UL<<((ch-10)*3),smpr,(ch-10)*3);
    }
    return YZF_OK;
}
YZF_RESULT yzf_adc_JOFR_set(YZF_ADC_POINTER adc,uint8_t ch,uint16_t offset){
    *(((uint32_t *)&(adc->JOFR1))+(ch-1))=offset;
    return YZF_OK;
}
YZF_RESULT yzf_adc_HTR_set(YZF_ADC_POINTER adc,uint16_t htr){
    YZF_MODIFY_REG(adc->HTR,0xFFF,htr,0);
    return YZF_OK;
}
YZF_RESULT yzf_adc_LTR_set(YZF_ADC_POINTER adc,uint16_t ltr){
    YZF_MODIFY_REG(adc->LTR,0xFFF,ltr,0);
    return YZF_OK;
}
uint16_t yzf_adc_JDR_get(YZF_ADC_POINTER adc,uint8_t jdr){
    return *(((uint32_t *)&(adc->JDR1))+(jdr-1));
}
uint16_t yzf_adc_DR_get(YZF_ADC_POINTER adc){
    return adc->DR;
}
YZF_RESULT yzf_adc_SQR_Counts_set(YZF_ADC_POINTER adc,uint8_t counts){
    YZF_MODIFY_REG(adc->SQR1,ADC_SQR1_L,(counts-1),ADC_SQR1_L_Pos);
    return YZF_OK;
}
YZF_RESULT yzf_adc_SQR_set(YZF_ADC_POINTER adc,uint8_t ch,uint8_t sqr){
    if(sqr<7){
        YZF_MODIFY_REG(adc->SQR3,0x1FUL<<((sqr-1)*5),ch,((sqr-1)*5));
    }else if(sqr<13){
        YZF_MODIFY_REG(adc->SQR2,0x1FUL<<((sqr-7)*5),ch,((sqr-7)*5));
    }else{
        YZF_MODIFY_REG(adc->SQR1,0x1FUL<<((sqr-13)*5),ch,((sqr-13)*5));
    }
    return YZF_OK;
}
YZF_RESULT  yzf_adc_JSQR_Counts_set(YZF_ADC_POINTER adc,uint8_t counts){
    YZF_MODIFY_REG(adc->JSQR,ADC_JSQR_JL,(counts-1),ADC_JSQR_JL_Pos);
    return YZF_OK;
}
YZF_RESULT yzf_adc_JSQR_set(YZF_ADC_POINTER adc,uint8_t ch,uint8_t jsq){
    YZF_MODIFY_REG(adc->SQR3,0x1FUL<<((jsq-1)*5),ch,((jsq-1)*5));
    return YZF_OK;
}
YZF_RESULT yzf_adc_SCAN(YZF_ADC_POINTER adc,YZF_BOOL isScan){
    YZF_MODIFY_REG(adc->CR1,ADC_CR1_SCAN,isScan,ADC_CR1_SCAN_Pos);
    return YZF_OK;
}